.TITLE DREXP .IDENT /05.04/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; T. J. MILLER 8-JUL-76 ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ; ; M. S. FOX ; J. M. LAWLER ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ; ; J. R. KAUFFMAN ; J. M. LAWLER ; L. B. MCCULLEY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ; ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY: ; ; B. S. MCCARTHY 4-NOV-87 05.04 ; ; BM404 -- ADD SUPPORT FOR D SPACE OVERMAP CHECK FIELD ; ; MACRO LIBRARY CALLS ; .MCALL HWDDF$,HDRDF$,PCBDF$,TCBDF$ HWDDF$ ;DEFINE HARDWARE OFFSETS HDRDF$ ;DEFINE TASK HEADER OFFSETS PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS ;+ ; **-$DREXP-EXTEND PARTITION ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EXTEND THE PARTITION OF THE ; ISSUING TASK BY A POSITIVE OR NEGATIVE INCREMENT. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(89.),DPB SIZE(3.). ; WD. 01 -- EXTEND INCREMENT. ; WD. 02 -- RESERVED. ; ; INPUTS: ; ; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE EXTEND INCREMENT IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF '+1' IS RETURNED. ; ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS8' IF TASK NOT IN SYSTEM CON- ; TROLLED PARTITION, TASK IS NOT CHECKPOINTABLE ; AND SPECIFIED POSITIVE INCREMENT, OR TASK HAS ; PREALLOCATED CHECKPOINT SPACE AND IS EXTENDING ; GREATER THAN INSTALLED SIZE. ; DIRECTIVE STATUS OF 'D.RS88' IF SPECIFIED INCREMENT IS ; INVALID. ;- .IF DF E$$XPR .IF DF D$$PAR $DRXP1:: .IFF ; DF D$$PAR $DREXP:: .ENDC ; DF D$$PAR .IF DF U$$DAS!S$$LIB MOV H.SMAP(R4),-(SP) ;KEEP A COPY OF SUPER AND USER ;MAPPING MASKS .ENDC ; DF U$$DAS!S$$LIB ; FIRST DETERMINE THAT THE TASK HAS NO I/O IN PROGRESS TO ITS ; TASK REGION, AND DISALLOW DIRECTIVE IF IT DOES. MOV T.ATT(R5),R0 ;POINT TO ATT DESC FOR TASK REGION TSTB A.IOC-A.TCBL(R0) ;DOES TASK HAVE I/O THROUGH THIS DESCR? BEQ 5$ ;IF EQ NO DRSTS D.RS83 ;IO IN PROGRESS ; NEXT CHECK FOR OTHER TASKS HAVING AN ATTACHMENT DESCRIPTOR TO ; THE ISSUING TASKS TASK REGION. IF THEY DO, WE CAN'T UPDATE THE ; WINDOW SO WE DISALLOW THE DIRECTIVE. 5$: MOV T.PCB(R5),R0 ;POINT TO TASK PCB TST @P.ATT(R0) ;ARE THERE OTHER TASKS ATTACHED? BEQ 7$ ;IF EQ NO DRSTS D.RS17 ;OTHER TASKS ARE ATTACHED ; CALCULATE POTENTIAL NEW SIZE OF TASK REGION BASED ON P.SWSZ AND ; THE INCREMENT IN THE DPB, DEFAULTING TO T.MXSZ IF THE INCREMENT ; WAS NOT SPECIFIED. 7$: MOV T.MXSZ(R5),R1 ;ASSUME RETURNING TO INSTALLED SIZE MOV (R3),R3 ;PICK UP SPECIFIED INCREMENT BEQ 10$ ;IF EQ DEFAULT TO INSTALLED SIZE ADD P.SWSZ(R0),R3 ;CALCULATE NEW SIZE MOV R3,R1 ;COPY NEW SIZE ; VERIFY THAT THE NEW SIZE IS LEGAL BY CHECKING FOR EXCEEDING ; $MXEXT AND IF TASK HAS ALLOCATED CHECKPOINT SPACE IS THE NEW ; SIZE TOO BIG. 10$: CMP R1,P.SWSZ(R0) ;TASK INCREASING SIZE? BLO 30$ ;IF LOS NO CMP R1,$MXEXT ;INCREASING PAST CURRENT MAXIMUM? BHI 45$ ;IF HI YES BIT #PS.CHK!PS.FXD,P.STAT(R0) ;TASK CHECKPOINTABLE? BEQ 20$ ;IF EQ YES DRSTS D.RS10 ;TASK IS NOT CHECKPOINTABLE 20$: BIT #T3.CAL,2(R2) ;TASK HAVE CHECKPOINT SPACE ALLOCATED? BEQ 30$ ;IF EQ NO CMP R1,T.MXSZ(R5) ;EXTENDING TO LARGER THAN INSTALLED SIZE BLOS 30$ ;IF LOS NO DRSTS D.RS18 ;YES, ILLEGAL ; CALCULATE NEW SIZE FROM VIRTUAL ZERO AND VALIDATE THAT THE ; HEADER STILL FITS IN THE REGION 30$: ; .IF DF P$$LAS MOV R1,-(SP) ;SAVE NEW TASK REGION SIZE SUB T.OFF(R5),R1 ;NORMALIZE TO TASK REGION ZERO .ENDC ; DF P$$LAS MOV R1,-(SP) ;COPY NEW SIZE FROM VIRTUAL ZERO SWAB (SP) ;CONVERT SIZE TO BYTES RORB (SP) ; ROR (SP) ; ROR (SP) ; .IF DF P$$LAS CMP R1,#200 ;NEW SIZE GREATER THAN 4K? BHI 35$ ;IF HI YES .ENDC CMP (SP),H.HDLN(R4) ;NEW TASK SIZE SMALLER THAN HEADER? BLO 45$ ;IF LO YES ; CHECK THROUGH THE WINDOWS FOR ONE WHICH OVERLAPS THE NEW SIZE OF ; THE TASK WINDOW 0 (OR 1 IF I/D TASK) 35$: MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKS .IF DF U$$DAS TST $DICSV+4 ;WAS AN OVERLAP MASK SPECIFIED? BEQ 359$ ;IF EQ NO BIT #T3.ROV,T.ST3(R5) ;RESIDENT OVERLAID? BNE 359$ ;IF NE YES, DON'T NEED TO CHECK OVERLAP MOVB W.BFPD+2(R4),R3 ;GET PDR ADDRESS (I SPACE) SUB #UISDR0,R3 ;ADJUST TO OFFSET ZERO BIT #T4.DSP,T.ST4(R5) ;TASK BUILD WITH SEPARATE I/D SPACE ? BEQ 355$ ;IF EQ NO, RETURN WITH ALL OVERMAP MASK MOVB W.BFPD+W.BLGH+2(R4),R3 ;GET PDR ADDRESS SUB #UDSDR0,R3 ;ADJUST TO OFFSET ZERO 355$: ASR R3 ;CONVERT TO BYTE INDEX MOVB R1,R2 ;GET NEW SIZE OF WINDOW ADD #177,R2 ;ROUND UP TO NEXT APR BOUNDARY ASH #-7,R2 ;CONVERT TO NUMBER OF APRS ADD R3,R2 ;FORM ENDING PDR NUMBER +1 MOVB $BCMSK-1(R2),R2 ;GET MASK UP TO LAST APR BICB $BCMSK-1(R3),R2 ;GET MASK UP TO FIRST APR BIT R2,$DICSV+4 ;ANY OVERLAP? BNE 90$ ;IF NE YES, ILLEGAL EXTEND 359$: .ENDC ;DF U$$DAS MOV (R4)+,R2 ;PICK UP NUMBER OF WINDOW BLOCKS TST (R4)+ ;POINT TO TASK LOW VIRTUAL ADDRESS .IF DF U$$DAS BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D ? BEQ 36$ ;IF EQ NO ADD #W.BLGH,R4 ;YES, POINT TO WINDOW 1 - D SPACE DEC R2 ;ADJUST WINDOW COUNT 36$: ; .ENDC ; DF U$$DAS .IF DF P$$LAS BIT #T3.ROV,T.ST3(R5) ;TASK HAVE RESIDENT OVERLAYS ? BNE 42$ ;IF NE YES, KEEP WINDOW ZERO INTACT .ENDC ; DF P$$LAS MOV (R4),R3 ;PICK UP TASK LOW VIRTUAL ADDRESS ASL R3 ;CONVERT TO 32W BLOCKS ROL R3 ; ROLB R3 ; SWAB R3 ; ADD R1,R3 ;CALC HIGH VIRTUAL ADDRESS IN 32W BLOCKS CMP R3,#2000 ;LEGAL SIZE? BHIS 45$ ;IF HIS NO 37$: ADD (R4),(SP) ;CALCULATE NEW TOP VIRTUAL ADDRESS 40$: DEC R2 ;MORE WINDOW BLOCKS TO GO? BLE 50$ ;IF LE NO ADD #W.BLGH,R4 ;POINT TO LOW VIRTUAL ADDRESS OF NEXT TST W.BSIZ-W.BLVR(R4) ;ESTABLISHED WINDOW? BEQ 40$ ;IF EQ NO .IF DF U$$DAS BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACE ? BEQ 41$ ;IF EQ NO BITB #20,W.BFPD-W.BLVR(R4) ;IS THIS D SPACE WINDOW ? BEQ 40$ ;IF EQ NO, DON'T CHECK 41$: ;REFERENCE LABEL .ENDC ; DF U$$DAS .IF DF P$$LAS CMP W.BPCB-W.BLVR(R4),R0 ;WINDOW MAPPED TO TASK REGION? (W.BPCB) BEQ 42$ ;IF EQ YES .IF DF S$$LIB TSTB W.BFPD-W.BLVR(R4) ;SUPERVISOR WINDOW? BPL 40$ ;IF PL YES .ENDC ; DF S$$LIB BR 44$ ;CHECK FOR ADDRESS OVERLAP 42$: MOV 2(R4),R3 ;PICK UP HIGH VIRTUAL ADDRESS (W.BHVR) SUB (R4),R3 ;CALCULATE LENGTH OF MAP - 1 INC R3 ;CALCULATE LENGTH OF MAP ASH #-6,R3 ;CONVERT TO 32 WORD BLOCKS BIC #176000,R3 ; ADD W.BOFF-W.BLVR(R4),R3 ;CALCULATE LAST 32W BLOCK MAPPED CMP 2(SP),R3 ;REDUCING SIZE CONFLICT WITH WINDOW ? BLO 90$ ;IF LO YES 44$: BIT #T3.ROV,T.ST3(R5) ;IS TASK RESIDENT OVERLAID ? BNE 40$ ;IF NE YES, UNCHANGED VIRTUAL ADDRESSING .ENDC CMP (SP),(R4) ;VIRTUAL ADDRESS OVERLAP? BLOS 40$ ;IF LOS NO 45$: BR 90$ ;ILLEGAL SIZE 50$: TST (SP)+ ;CLEAN STACK ; CHECK TO SEE IF TASK REGION CAN BE EXTENDED IN PLACE .IF DF P$$LAS MOV (SP)+,R1 ;RESTORE NEW TASK REGION SIZE .ENDC ; DF P$$LAS MOV P.MAIN(R0),R2 ;POINT TO MAIN PARTITION PCB CMP R1,P.SIZE(R2) ;MAIN PARTITION LARGE ENOUGH? BHI 90$ ;IF HI NO MOV R1,P.SWSZ(R0) ;SET SWAP SIZE FOR TASK PARTITION CLR R4 ;INITIALIZE END OF HOLE CALCULATION MOV P.SUB(R0),R3 ;POINT TO NEXT SUBPAR AFTER TASK PAR BNE 60$ ;IF NE THERE IS ONE MOV R2,R3 ;ELSE POINT TO MAIN PARTITION ADD P.SIZE(R3),R4 ;CALCULATE END OF HOLE 60$: ADD P.REL(R3),R4 ; MOV P.REL(R0),R3 ;CALCULATE END OF DESIRED SPACE ADD R1,R3 ; CMP R3,R4 ;WILL EXTEND WORK IN PLACE? BLOS 70$ ;IF LOS YES ; TASK REGION COULD NOT BE EXTENDED IN PLACE - ATTEMPT TO CHECKPOINT ; SO THAT WE CAN BRING TASK IN AT ITS NEW SIZE CALL $SETRT ;FORCE RESCHEDULING MOV T.PCB(R5),R1 ;POINT TO TASK PCB .IF DF A$$CNT BIS #BF.XTK,$ACNFE ;SET FLAG SO CHECKPOINT IS NOT COUNTED .ENDC ;A$$CNT CALL $ICHKP ;INITIATE THE CHECKPOINT MOV T.PCB(R5),R0 ;POINT TO TASK PCB AGAIN BIT #PS.CKP,P.STAT(R0) ;WAS THE CHECKPOINT INITIATED? BEQ 65$ ;IF EQ NO TALLY$ B.CKEX,XA$$CP ;COUNT AN EXTEND CHECKPOINT .IF DF U$$DAS!S$$LIB TST (SP)+ ;CLEAN MAPPING WORDS OFF STACK .ENDC ; DF U$$DAS!S$$LIB RETURN ; ; DIRECTIVE RETURN FOR INVALID INCREMENT 90$: DRSTS D.RS84 ;INVALID INCREMENT SPECIFIED ;(PLACED HERE TO KEEP BRANCHES ;ALIVE) ; ATTEMPTING TO CHECKPOINT TASK REGION FAILED. RESET SWAP SIZE ; AND RETURN DIRECTIVE STATUS 65$: MOV P.SIZE(R0),P.SWSZ(R0) ;RESET SWAP SIZE DRSTS D.RS1 ;POOL OR CHECKPOINT FILE ALLOC FAILURE ; IF THE TASK REGION IS DECREASING IN SIZE, CALL $NXTSK ON EXIT ; FROM THIS DIRECTIVE TO INSURE REALLOCATION OF NEWLY FREED SPACE 70$: CMP R1,P.SIZE(R0) ;DECREASING TASK SIZE? BHIS 71$ ;IF HIS NO .IF DF U$$DAS!S$$LIB MOV (SP),-(SP) ;COPY MAPPING MASKS MOV #$NXTSK,2(SP) ;INSURE THAT PARTITION WILL ;BE REALLOCATED .IFF ; DF U$$DAS!S$$LIB MOV #$NXTSK,-(SP) ;INSURE PARTITION WILL BE REALLOCATED .ENDC ; DF U$$DAS!S$$LIB ; IF THE TASK HAS I/O IN PROGRESS TO OTHER THAN THE TASK REGION ; SET THE MAPPING CHANGE BIT. THIS COMPENSATES FOR POSSIBLE ; UNMAPPING OF I/O STATUS BLOCKS. TSTB T.IOC(R5) ;DOES TASK HAVE I/O? (MUST BE IN COMMON) BEQ 71$ ;IF EQ NO BIS #T3.MPC,T.ST3(R5) ;SET MAPPING BIT DUE TO SHRINK 71$: ;+ ; ** W A R N I N G ** ; ; SPM HOOKPOINT NUMBER 10. ; ; DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM ;- $SPH10==. ;SPM CHANGES THE INSTRUCTION AT ;THE LOCATION OF THIS LABEL MOV R1,P.SIZE(R0) ;EXTEND TASK IN PLACE ; IF THE TASK WAS BUILT WITH RESIDENT OVERLAYS, WE DO NOT ATTEMPT ; TO CHANGE THE MAPPING OF ANY OF THE TASKS WINDOWS .IF DF P$$LAS BIT #T3.ROV,T.ST3(R5) ;TASK HAVE RESIDENT OVERLAYS? BNE 80$ ;IF NE YES, DO NOT CHANGE MAPPING .ENDC ; SET UP TO UNMAP CURRENT TASK WINDOW (0, OR 1 IF I/D TASK) MOV $SAHPT,R1 ;GET HEADER ADDRESS MOV H.WND(R1),R1 ;POINT TO NUMBER OF WINDOW BLOCKS .IF DF U$$DAS BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH I/D SPACE BEQ 73$ ;IF EQ NO ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 INSTEAD .ENDC ; DF U$$DAS 73$: MOVB W.BFPD+2(R1),R3 ;PICK UP FIRST PDR ADDRESS ; LOOP TO UNMAP CURRENT CONTEXT OF TASK WINDOW (0 OR 1) 74$: CLR (R3)+ ;UNMAP NEXT PDR .IF DF U$$DAS CMP #UDSDR0+2,R3 ;DATA SPACE WINDOW ? BLOS 7405$ ;IF LOS YES BITB $BTMSK-UINDR0-2(R3),1(SP) ;USER D SPACE MAPPED ? BNE 741$ ;IF NE NO CLR UDSDR0-UINDR0-2(R3) ;UNMAP USER D SPACE .ENDC .IF DF S$$LIB BITB $BTMSK-2-UINDR0-2(R3),(SP) ;SUPER D SPACE MAPPED ? BNE 741$ ;IF NE NO CLR SDSDR0-UINDR0-2(R3) ;UNMAP SUPER DATA SPACE .ENDC .IF DF U$$DAS BR 741$ ;SKIP D SPACE WINDOW CODE 7405$: BICB $BTMSK-UDSDR0-2(R3),1(SP) ;INDICATE USER D NOT MAPPED BITB $BTMSK-2-UDSDR0-2(R3),(SP) ;SUPER D SPACE MAPPED ? BNE 741$ ;IF NE NO CLR SDSDR0-UDSDR0-2(R3) ;UNMAP SUPER DATA SPACE .ENDC ; DF U$$DAS 741$: DECB W.BNPD+2(R1) ;ANY MORE APRS TO PROCESS ? BNE 74$ ;IF NE YES ; SETUP NEW WINDOW AND PREPARE TO REMAP APRS INTO NEW CONTEXT ; IF THIS IS A USER I/D SYSTEM, WE MUST RE-ESTABLISH POINTER ; TO WINDOW 0 SINCE $MAPTK WILL RE-ADJUST THE POINTER. .IF DF U$$DAS MOV $SAHPT,R1 ;GET ADDRESS OF CURRENT HEADER MOV H.WND(R1),R1 ;POINT TO NUMBER OF WINDOW BLOCKS .ENDC ; DF U$$DAS CALL $MAPTK ;MAP TASK ADDRESS WINDOW MOV P.REL(R0),R3 ;CALCULATE FIRST APR OFFSET .IF DF P$$LAS ADD W.BOFF-W.BLPD(R1),R3 ; .ENDC MOV (R1),R2 ;PICK UP LAST PDR IMAGE MOVB -(R1),R4 ;PICK UP NUMBER OF PDR'S MOVB -(R1),R1 ;PICK UP FIRST PDR ADDRESS ; LOOP TO SET UP APRS FOR NEW TASK WINDOW CONTEXT 75$: MOV R3,UINAR0-UINDR0(R1) ;LOAD NEXT PAR MOVB R2,(R1)+ ;SET ACCESS NEXT PDR MOVB #177,(R1)+ ;SET SIZE NEXT PDR .IF DF U$$DAS CMP #UDSDR0+2,R1 ;DATA SPACE WINDOW ? BLOS 755$ ;IF LOS YES BITB $BTMSK-UINDR0-2(R1),1(SP) ;USER D SPACE MAPPED ? BNE 76$ ;IF NE NO MOV R3,UDSAR0-UINDR0-2(R1) ;LOAD USER D PAR MOV -2(R1),UDSDR0-UINDR0-2(R1) ;LOAD USER D PDR .ENDC ; DF U$$DAS .IF DF S$$LIB BITB $BTMSK-2-UINDR0-2(R1),(SP) ;SUPER D MAPPED ? BNE 76$ ;IF NE NO MOV R3,SDSAR0-UINDR0-2(R1) ;LOAD SUPER D PAR MOV -2(R1),SDSDR0-UINDR0-2(R1) ;LOAD SUPER D PDR .IF DF U$$DAS BR 76$ ;SKIP D SPACE WINDOW CODE 755$: BISB $BTMSK-UDSDR0-2(R1),1(SP) ;INDICATE D SPACE MAPPED BITB $BTMSK-2-UDSDR0-2(R1),(SP) ;SUPER D SPACE MAPPED ? BNE 76$ ;IF NE NO MOV R3,SDSAR0-UDSDR0-2(R1) ;LOAD SUPER D PAR MOV -2(R1),SDSDR0-UDSDR0-2(R1) ;LOAD SUPER D PDR .ENDC ; DF U$$DAS .IFTF ; DF S$$LIB 76$: ADD #200,R3 ;ADVANCE APR BASE DEC R4 ;MORE TO GO? BNE 75$ ;IF NE YES MOV R2,-(R1) ;SET LAST PDR .IF DF U$$DAS BIT #20,R1 ;DATA SPACE WINDOW ? BNE 78$ ;IF NE YES BITB $BTMSK-UINDR0(R1),1(SP) ;USER D MAPPED ? BNE 80$ ;IF NE NO MOV R2,UDSDR0-UINDR0(R1) ;SET LAST USER D PDR .ENDC ; DF U$$DAS .IFT ; DF S$$LIB BITB $BTMSK-2-UINDR0(R1),(SP) ;SUPER D MAPPED ? BNE 80$ ;IF NE NO MOV R2,SDSDR0-UINDR0(R1) ;SET LAST SUPER D PDR .ENDC .IF DF U$$DAS BR 80$ ;SKIP DATA SPACE WINDOW CODE 78$: BITB $BTMSK-2-UDSDR0(R1),(SP) ;SUPER DATA SPACE MAPPED BNE 80$ ;IF NE NO MOV R2,SDSDR0-UDSDR0(R1) ;SET LAST SUPER D PDR .ENDC ; DF U$$DAS ; CLEANUP STACK AND EXIT FROM DIRECTIVE 80$: ;REFERENCE LABEL .IF DF U$$DAS MOV $SAHPT,R1 ;POINT TO TASK HEADER MOV (SP)+,H.SMAP(R1) ;RESTORE D SPACE MAP IN HEADER .IFF ; DF U$$DAS .IF DF S$$LIB TST (SP)+ ;CLEAN MAP BYTES OFF STACK .ENDC ; DF S$$LIB .ENDC ; DF U$$DAS RETURN ; .ENDC .END